require(tidyverse)
require(tidyr)
require(knitr)
require(dplyr)
require(ggplot2)
require(gganimate)
# cool packages i didn't end up using require(aRtsy) from github
# devtools::install_github('marcusvolz/mathart') require(mathart)
# devtools::install_github('cutterkom/generativeart') require(generativeart)
When I was in the second semester of my third year of undergrad, I took a course called “Enzymes,” which was essentially a literature based biochemistry class on specific classes of enzymes. It was very organic chemistry focused–makes sense since biochem is bio-applied orgo– and it inspired me to ask this research question in the Research Neurophysiology class I was taking that semester: how do reduction and oxidation (redox) reagents modulate the chloride current through chloride-selective ligand-gated ion channels (LGIC)?
The chloride LGIC in question here is the Glycine receptor. Glycine receptors mediate inhibitory synaptic transmission through the opening of a chloride-permeable pore that triggers hyperpolarization of the membrane and inhibition of the neuronal firing generated in the central nervous system (CNS). Glycine receptors are pentameric structures comprised of five subunits (\(\alpha\) and \(\beta\)), each composed of four transmembrane domains (Figure 1; Lynch et al., 2004; Du et al., 2015). A central concept of the relationship between ligand binding and channel gating in Cys-loop receptors is the conformation of the Cys-loop correlate swith the functional state of the receptor (Figure 1; Du et al., 2015; Purohit & Auerbach, 2013; Thompson, 2010). The allosteric change in the ligand-binding domain affects the \(\alpha\)-subunits, resulting in the rotations of their inner \(\beta\)-sheets. The rotations of the sheets are transmitted by their connected M2-helices to the pore’s gate resulting in a configuration permeable to the ion. The \(\alpha\)-subunits act as the primary mediators of the conformational change by connecting to the transmembrane portion of the receptor, characterized by a counter-clockwise rotation of the pore’s axis (Du et al., 2015; Unwin et al., 2002).
Reduced glutathione (GSH) and oxidized glutathione (GSSG) are endogenous redox agents naturally present in the CNS at millimolar concentrations (5-10mM) (Calero & Calvaro, 2008). Pan et al. (1995) found, in retinal ganglion cells GSH at 5mM enhanced GABA-activated chloride currents and decreased glycine-activated chloride currents through their respective receptors. Amato et al. (1999) confirmed Pan et al.’s finding in HEK cells, showing at concentrations ranging from 1-10mM, GSH enhanced GABA-activated response in concentration-dependent manner while GSSG caused small inhibitory effects.
LOSS OF ELECTRONS = OXIDATION:
\(X^+ - e^- = Xº\)
1. Control Ephys Recording Solution (ND)
2. Positive Control: 50µM Glycine in ND
3. Pre-treatment: 5mM GSSG in ND
4. Co-Application 50µM Glycine + 5mM GSSG in ND
load GSSG data
f1 <- "https://raw.githubusercontent.com/slcornett/creative-data-visualization/main/data/2018-04-05_GSSG_Oxidation.csv"
gssg <- read_csv(f1, col_names = TRUE)
## Rows: 321761 Columns: 2
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (2): time_s, GSSG_Current_µA
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
gssg <- gssg %>%
filter(time_s >= 1000, time_s <= 2000) # make it slightly less giant
head(gssg)
## # A tibble: 6 × 2
## time_s GSSG_Current_µA
## <dbl> <dbl>
## 1 1000 0.0292
## 2 1000. 0.0262
## 3 1000. 0.0278
## 4 1000. 0.0281
## 5 1000. 0.0261
## 6 1000. 0.0294
# static plot
gssg_p1 <- ggplot(data = gssg, aes(x = time_s, y = GSSG_Current_µA, color = GSSG_Current_µA)) + scale_color_continuous(type = "viridis") +
geom_line(show.legend = FALSE) + ggtitle("Oxidative Effect of GSSG on Glycine-Receptor") + theme_classic()
gssg_p1
# animated! like a heart beat
gssg_a1 <- ggplot(data = gssg, aes(x = time_s, y = GSSG_Current_µA, color = GSSG_Current_µA)) + scale_color_continuous(type = "viridis") +
geom_jitter(show.legend = FALSE) + ggtitle("Oxidative Effect of GSSG on Glycine-Receptor") + theme_classic() +
labs(x = "time (s): {frame_time}", y = "Current uA") + # gganimate labs(x = "time (s):
labs(x = "time (s): {frame_time}", y = "Current uA") + # gganimate {frame_time}", y = "Current
labs(x = "time (s): {frame_time}", y = "Current uA") + # gganimate uA") + # gganimate
transition_time(time = gssg$time_s) + shadow_wake(wake_length = 0.2, alpha = FALSE) + ease_aes("linear")
gssg_a1
# with a trace
gssg_a2 <- ggplot(data = gssg, aes(x = time_s, y = GSSG_Current_µA, color = GSSG_Current_µA)) + scale_color_continuous(type = "viridis") +
geom_jitter(show.legend = FALSE) + ggtitle("Oxidative Effect of GSSG on Glycine-Receptor") + theme_classic() +
labs(x = "time (s): {frame_time}", y = "Current µA") + # gganimate labs(x = "time (s):
labs(x = "time (s): {frame_time}", y = "Current µA") + # gganimate {frame_time}", y = "Current
labs(x = "time (s): {frame_time}", y = "Current µA") + # gganimate µA") + # gganimate
transition_time(time = gssg$time_s) + shadow_wake(wake_length = 0.1, alpha = FALSE) + shadow_mark(alpha = 0.3,
size = 1) + ease_aes("linear")
gssg_a2
Here I plot the trace for the Glycine receptor exposed to GSSG with its absolute value trace. I think they look cool.
# adding the absolute value to plot bot the current and absolute value of the current together
# because i bet it would look very cool
gssg <- gssg %>%
mutate(abGSSG_Current_µA = abs(GSSG_Current_µA))
# gather(key = 'Current', value = 'value', abGSSG_Current_µA ) # collapses 2 variables into
# key-value pairs
head(gssg) # cool absolute value present in the dataset
## # A tibble: 6 × 3
## time_s GSSG_Current_µA abGSSG_Current_µA
## <dbl> <dbl> <dbl>
## 1 1000 0.0292 0.0292
## 2 1000. 0.0262 0.0262
## 3 1000. 0.0278 0.0278
## 4 1000. 0.0281 0.0281
## 5 1000. 0.0261 0.0261
## 6 1000. 0.0294 0.0294
# try to plot two traces on the same plot static
gssg_p2 <- ggplot(data = gssg, aes(x = time_s)) + geom_line(aes(y = GSSG_Current_µA, color = GSSG_Current_µA),
show.legend = FALSE) + geom_line(aes(y = abGSSG_Current_µA, color = abGSSG_Current_µA), show.legend = FALSE) +
scale_color_continuous(type = "viridis") + ggtitle("Oxidative Effect of GSSG on Glycine-Receptor") +
theme_classic() + labs(x = "time (s)", y = "Current µA")
gssg_p2
# animated line
gssg_a3 <- ggplot(data = gssg, aes(x = time_s)) + geom_jitter(aes(y = GSSG_Current_µA, color = GSSG_Current_µA),
show.legend = FALSE) + geom_jitter(aes(y = abGSSG_Current_µA, color = abGSSG_Current_µA), show.legend = FALSE) +
scale_color_continuous(type = "viridis") + ggtitle("Oxidative Effect of GSSG on Glycine-Receptor") +
theme_classic() + labs(x = "time (s): {frame_time}", y = "Current µA") + # gganimate theme_classic()
theme_classic() + labs(x = "time (s): {frame_time}", y = "Current µA") + # gganimate + labs(x =
theme_classic() + labs(x = "time (s): {frame_time}", y = "Current µA") + # gganimate "time (s):
theme_classic() + labs(x = "time (s): {frame_time}", y = "Current µA") + # gganimate {frame_time}",
theme_classic() + labs(x = "time (s): {frame_time}", y = "Current µA") + # gganimate y =
theme_classic() + labs(x = "time (s): {frame_time}", y = "Current µA") + # gganimate "Current
theme_classic() + labs(x = "time (s): {frame_time}", y = "Current µA") + # gganimate µA") + #
theme_classic() + labs(x = "time (s): {frame_time}", y = "Current µA") + # gganimate gganimate
transition_time(time = gssg$time_s) + shadow_wake(wake_length = 0.1, alpha = FALSE) + shadow_mark(alpha = 0.3,
size = 1) + ease_aes("linear")
gssg_a3
# i think it indeed looks very cool
GAIN OF ELECTRIONS = REDUCTION:
\(X^+ + e^- = Xº\)
1. Control Ephys Recording Solution (ND)
2. Positive Control: 50µM Glycine in ND
3. Pre-treatment: 5mM GSH in ND
4. Co-Application 50µM Glycine + 5mM GSH in ND
load GSH data
f2 <- "https://raw.githubusercontent.com/slcornett/creative-data-visualization/main/data/2018-04-12_GSH_Reduction.csv"
gsh <- read_csv(f2, col_names = TRUE)
## Rows: 237740 Columns: 2
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (2): time_s, GSH_Current_µA
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
gsh <- gsh %>%
filter(time_s >= 300, time_s <= 1600) # make it slightly less giant, frame the cool stuff
head(gsh)
## # A tibble: 6 × 2
## time_s GSH_Current_µA
## <dbl> <dbl>
## 1 300 0.0517
## 2 300. 0.0495
## 3 300. 0.0517
## 4 300. 0.0508
## 5 300. 0.0505
## 6 300. 0.052
# second verse, same as the first, but now with a reducing agent doing something unexpected statics
# plot
gsh_p1 <- ggplot(data = gsh, aes(x = time_s, y = GSH_Current_µA, color = GSH_Current_µA)) + scale_color_continuous(type = "viridis") +
geom_line(show.legend = FALSE) + ggtitle("Reductive Effect of GSH on Glycine-Receptor") + theme_classic() +
labs(x = "time (s)", y = "Current (µA)")
gsh_p1
# animated! like a heart beat
gsh_a1 <- ggplot(data = gsh, aes(x = time_s, y = GSH_Current_µA, color = GSH_Current_µA)) + scale_color_continuous(type = "viridis") +
geom_jitter(show.legend = FALSE) + ggtitle("Reductive Effect of GSH on Glycine-Receptor") + theme_classic() +
labs(x = "time (s): {frame_time}", y = "Current (µA)") + # gganimate labs(x = "time (s):
labs(x = "time (s): {frame_time}", y = "Current (µA)") + # gganimate {frame_time}", y =
labs(x = "time (s): {frame_time}", y = "Current (µA)") + # gganimate "Current (µA)") + #
labs(x = "time (s): {frame_time}", y = "Current (µA)") + # gganimate gganimate
transition_time(time = gsh$time_s) + shadow_wake(wake_length = 0.2, alpha = FALSE) + ease_aes("linear")
gsh_a1
# with a trace
gsh_a2 <- ggplot(data = gsh, aes(x = time_s, y = GSH_Current_µA, color = GSH_Current_µA)) + scale_color_continuous(type = "viridis") +
geom_jitter(show.legend = FALSE) + ggtitle("Reductive Effect of GSH on Glycine-Receptor") + theme_classic() +
labs(x = "time (s): {frame_time}", y = "Current (µA)") + # gganimate labs(x = "time (s):
labs(x = "time (s): {frame_time}", y = "Current (µA)") + # gganimate {frame_time}", y =
labs(x = "time (s): {frame_time}", y = "Current (µA)") + # gganimate "Current (µA)") + #
labs(x = "time (s): {frame_time}", y = "Current (µA)") + # gganimate gganimate
transition_time(time = gsh$time_s) + shadow_wake(wake_length = 0.1, alpha = FALSE) + shadow_mark(alpha = 0.3,
size = 1) + ease_aes("linear")
gsh_a2
As above, so below: here I plot the trace for the Glycine receptor exposed to GSH with its absolute value trace. Yeah, they definitely look cool.
# adding the absolute value to plot bot the current and absolute value of the current together
# because i bet it would look very cool
gsh <- gsh %>%
mutate(abGSH_Current_µA = abs(GSH_Current_µA))
head(gsh) # cool absolute value present in the dataset
## # A tibble: 6 × 3
## time_s GSH_Current_µA abGSH_Current_µA
## <dbl> <dbl> <dbl>
## 1 300 0.0517 0.0517
## 2 300. 0.0495 0.0495
## 3 300. 0.0517 0.0517
## 4 300. 0.0508 0.0508
## 5 300. 0.0505 0.0505
## 6 300. 0.052 0.052
# try to plot two traces on the same plot static 2 lines
gsh_p2 <- ggplot(data = gsh, aes(x = time_s)) + geom_line(aes(y = GSH_Current_µA, color = GSH_Current_µA),
show.legend = FALSE) + geom_line(aes(y = abGSH_Current_µA, color = abGSH_Current_µA), show.legend = FALSE) +
scale_color_continuous(type = "viridis") + ggtitle("Reductive Effect of GSH on Glycine-Receptor") +
theme_classic() + labs(x = "time (s)", y = "Current µA")
gsh_p2
# animated line
gsh_a3 <- ggplot(data = gsh, aes(x = time_s)) + geom_jitter(aes(y = GSH_Current_µA, color = GSH_Current_µA),
show.legend = FALSE) + geom_jitter(aes(y = abGSH_Current_µA, color = abGSH_Current_µA), show.legend = FALSE) +
scale_color_continuous(type = "viridis") + ggtitle("Reductive Effect of GSH on Glycine-Receptor") +
theme_classic() + labs(x = "time (s): {frame_time}", y = "Current µA") + # gganimate theme_classic()
theme_classic() + labs(x = "time (s): {frame_time}", y = "Current µA") + # gganimate + labs(x =
theme_classic() + labs(x = "time (s): {frame_time}", y = "Current µA") + # gganimate "time (s):
theme_classic() + labs(x = "time (s): {frame_time}", y = "Current µA") + # gganimate {frame_time}",
theme_classic() + labs(x = "time (s): {frame_time}", y = "Current µA") + # gganimate y =
theme_classic() + labs(x = "time (s): {frame_time}", y = "Current µA") + # gganimate "Current
theme_classic() + labs(x = "time (s): {frame_time}", y = "Current µA") + # gganimate µA") + #
theme_classic() + labs(x = "time (s): {frame_time}", y = "Current µA") + # gganimate gganimate
transition_time(time = gsh$time_s) + shadow_wake(wake_length = 0.1, alpha = FALSE) + shadow_mark(alpha = 0.3,
size = 1) + ease_aes("linear")
gsh_a3
Amato, A., Connolly, C. N., Moss, S. J., & Smart, T. G. (1999). Modulation of neuronal and recombinant GABA A receptors by redox reagents. The Journal of Physiology, 517(1), 35–50. https://doi.org/10.1111/j.1469-7793.1999.0035z.x
Calero, C. I., & Calvo, D. J. (2008). Redox modulation of homomeric ρ1 GABAC receptors: Redox modulation of GABAρ1 receptors. Journal of Neurochemistry, 105(6), 2367–2374. https://doi.org/10.1111/j.1471-4159.2008.05319.x
Du, J., Lü, W., Wu, S., Cheng, Y., & Gouaux, E. (2015). Glycine receptor mechanism elucidated by electron cryo-microscopy. Nature, 526(7572), 224–229. https://doi.org/10.1038/nature14853
Lynch, J. W. (2004). Molecular structure and function of the glycine receptor chloride channel. Physiological Reviews, 84(4), 1051–1095. https://doi.org/10.1152/physrev.00042.2003
Pan, Z. H., Bahring, R., Grantyn, R., & Lipton, S. A. (1995). Differential modulation by sulfhydryl redox agents and glutathione of GABA- and glycine-evoked currents in rat retinal ganglion cells. Journal of Neuroscience, 15(2), 1384–1391. https://doi.org/10.1523/JNEUROSCI.15-02-01384.1995
Purohit, P., & Auerbach, A. (2013). Loop C and the mechanism of acetylcholine receptor–channel gating. Journal of General Physiology, 141(4), 467–478. https://doi.org/10.1085/jgp.201210946
Thompson, A. J., Lester, H. A., & Lummis, S. C. R. (2010). The structural basis of function in Cys-loop receptors. Quarterly Reviews of Biophysics, 43(4), 449–499. https://doi.org/10.1017/S0033583510000168
Unwin, N., Miyazawa, A., Li, J., & Fujiyoshi, Y. (2002). Activation of the nicotinic acetylcholine receptor involves a switch in conformation of the α subunits. Journal of Molecular Biology, 319(5), 1165–1176. https://doi.org/10.1016/S0022-2836(02)00381-9